perm filename PAGES.SAI[PUB,SYS] blob
sn#195740 filedate 1979-09-02 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00014 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 BEGOF("PAGES")
C00007 00003 PUBLIC SIMPLE PROCEDURE PAGES! $"#
C00008 00004 PUBLIC SIMPLE PROCEDURE FINIPAGES $"#
C00009 00005 PUBLIC RECURSIVE PROCEDURE DBLANKPAGE $"#
C00010 00006 PUBLIC RECURSIVE PROCEDURE DFRAME(BOOLEAN BOXFRM) $"#
C00012 00007 PUBLIC PROCEDURE FINPAGE $"#
C00021 00008 PUBLIC SIMPLE PROCEDURE FIXFRAME(INTEGER FRIDA) $"#
C00022 00009 PUBLIC SIMPLE PROCEDURE GROWOWLS(INTEGER EXTRA) $"#
C00023 00010 PUBLIC SIMPLE PROCEDURE MAKEPAGE(INTEGER HIGH, WIDE) $"#
C00024 00011 PUBLIC SIMPLE PROCEDURE NEXTPAGE $"#
C00025 00012 PUBLIC SIMPLE PROCEDURE OPENFRAME $"#
C00026 00013 PUBLIC SIMPLE PROCEDURE OPENPAGE $"#
C00027 00014 FINISHED
C00028 ENDMK
C⊗;
BEGOF("PAGES")
COMMENT
All the output lines tentatively placed in the current frame are
stored in intermediate files and referenced by sequential number from
the integer array OWLS (OWtput LineS). Its length is sufficient to
hold every line of every column of every area in it. The general
form of a string referenced from OWLS is:
<chars><cr><chars><cr>...<lf>
One of the <chars> (the last) may be a line that needs to be
justified in Pass Two. Each word break in such a substring is
represented by a ALTMODE -- these mark the places that extra spaces
may be added. Pass Two also needs to know about FONT changes -- in
the present version, this is limited to underlining, superscripts,
and subscripts. A FONT change is signalled by the character pair
'177 <code>. Finally, Pass Two will fill in forward references
marked '13 (vertical tab).
Other information must be known about each string in OWLS. There
must be an indication of how many spaces to add to a justify-line
during Pass Two, and there must be mobility restrictions to assure
that groups stay together and that section titles stay at tops of
pages. This information is kept in integer arrays SHORT and MOLES
(MObility of LinES) of the same size as OWLS. MOLES[J] is the
descriptor for OWLS[J]. To access these entries, the value J is
stored in an "area array" associated with the area the line was
placed in, at element [C,L] for the C'th column and L'th line.
A Moles descriptor looks like this:
--------------------------------------------------
| | |L|H|L|R|A|B| | |
| | |O|O|E|I|B|E| | |
|UN-USED| FOOT |C|R|F|G|O|L| LABEL | LEAD |
| | |K|I|T|H|V|O| | |
| | | |Z| |T|E|W| | |
--------------------------------------------------
0.....6 7.....11-2-3-4-5-6-7-18..........31 32..35
Another array parallel to SHORT and MOLES is MLEAD. When an entry is
zero, it means that the mill leading above the line is the normal
value MILLVERTI (initiallized in OWLPLACE inside PASTE). A nonzero
value is added to MILLVERTI in pass 2 to compute the unusual mill
leading of the line.
;
PROCEDURES
PUBLIC SIMPLE PROCEDURE PAGES! ;$"#
BEGIN "PAGES!"
OLX ← -1 ; OLMAX ← 5 ;
OWLSEQ ← MESGS ← 0 ;
END "PAGES!" ;
PUBLIC SIMPLE PROCEDURE FINIPAGES ;$"#
BEGIN "FINIPAGES"
COMMENT Finish Last Page File ;
IF INTER GEQ 0 THEN
BEGIN
FOR DUMMY←1 THRU 5 DO WORDOUT(INTER,-20) ;
RELEASE(INTER) ;
RELEASE(SINTER) ;
END ;
END "FINIPAGES" ;
PUBLIC RECURSIVE PROCEDURE DBLANKPAGE ;$"#
BEGIN COMMENT LEAVE N BLANK PAGES WITHOUT AFFECTING THE PAGE NUMBER ;
INTEGER I, J, N ;
PASS ; N ← CVD(E("1", NULL)) ;
IF NOT ON THEN RETURN ;
DBREAK ;
IF OLDPGIDA THEN NEXTPAGE ;
IF INTER LEQ 0 THEN NOPORTION ;
FOR I ← 1 THRU N DO
FOR J ← PHIGH, PWIDE, EVENLEFTBORDER, ODDLEFTBORDER, -10 DO
WORDOUT(INTER, J) ;
END ;
PUBLIC RECURSIVE PROCEDURE DFRAME(BOOLEAN BOXFRM) ;$"#
BEGIN
INTEGER L, I ;
PRELOAD!WITH "HIGH", "WIDE" ; OWN STRING ARRAY POST[1:2];
STRING ARRAY PAR[1:2] ;
DAPART ; PASS ; PARAMS(2,NULLS,PAR,POST);
IF ON THEN
IF BOXFRM THEN BEGIN END
ELSE
BEGIN
PHIGH←FHIGH←IF NULSTR(PAR[1]) THEN 1 ELSE CVD(PAR[1]) ;
PWIDE←FWIDE←IF NULSTR(PAR[2]) THEN 1 ELSE CVD(PAR[2]) ;
IF OLDPGIDA THEN NEXTPAGE ;
L ← NULLAREAS ;
WHILE L DO BEGIN
I ← AREAIDA ; IDASSIGN(AREAIDA←L,THISAREA) ; L ← RH(INA) ;
OPEN!ACTIVE(DEFA) ← 0 ; GOAWAY(AREAIDA) ; IF (AREAIDA←I) THEN IDASSIGN(AREAIDA,THISAREA) ;
END ;
NULLAREAS ← 0 ;
END ;
END "DFRAME" ;
PUBLIC PROCEDURE FINPAGE ;$"#
BEGIN "FINPAGE" COMMENT ***T EMPO RA RY V ERS I ON -- No Boxes **** ;
INTEGER A, CS, LS, C, L, X, LB, LBPAGE, LINK, LINENO, FOOTLINE1, F, OWLINE, ARIX ;
INTEGER NULINE, NUPINE, NUINE, NLFOOT, NPFOOT, NFOOT, NAREA ;
IF EXNEXTPAGE THEN BEGIN WARN("=","Response to PAGE change called NEXT PAGE again.") ; RETURN END ;
EXNEXTPAGE ← TRUE ;
BEGIN "PAGEOUT"
COMMENT PASS 1 OUTPUT FORMAT FOR EACH PAGE :
Height Width MillLeftMargin MillRightMargin
For each area:
UpperLine NumCols NumLines
For each column:
LeftChar
For each non-null line:
LineNo
How far short of being justified
Excess mill leading
Index of Intermediate Ascii File line
0
-10
;
IF OLDPGIDA NEQ FRAMEIDA THEN BEGIN WARN("=","FRAME NEQ PAGE at end of page"); FIXFRAME(OLDPGIDA) END ;
IF AREAIDA AND AREAIXM AND STATUS=1 THEN CLOSEAREA(AREAIXM, FALSE) ;
IF (A ← ARF) THEN
BEGIN "NONEMPTY"
INTEGER ARRAY XTRALINES[1:HIGHF]; RKJ TO FIXUP "TOPLINES" OF AREAS;
IF INTER LEQ 0 THEN NOPORTION ;
LS←0;
WHILE A DO BEGIN "COLLECTXGENS"
IDASSIGN(AREAIDA←A, THISAREA) ; A ← ARA ; IDASSIGN(AAA, AA) ;
IF STATA THEN LS ← LS + (XTRALINES[ULLA MAX 1] ← XGENA);
END "COLLECTXGENS";
A←ARF;
WORDOUT(INTER, HIGHF+LS) ; WORDOUT(INTER, WIDEF) ;
L ← ODDLEFTBORDER ; F ← EVENLEFTBORDER ;
IF NULSTR(S←CTR!VAL(PATPAGE)) OR CVD(S) MOD 2 THEN F SWAP L ;
WORDOUT(INTER, F) ; WORDOUT(INTER, L) ; TES 8/29/74;
WHILE A DO BEGIN "AFTER AREA RESPONSES"
IDASSIGN(AREAIDA←A, THISAREA) ; A ← ARA ; IDASSIGN(AAA, AA) ;
IF (X ← DEFA) AND STATA=1 AND FINDTRAN(LDB(BIXNUM(X)), 3) THEN RESPOND(LLTHIS) ;
END "AFTER AREA RESPONSES" ;
A ← ARF ;
WHILE A DO BEGIN "CLOSE ALL AREAS"
IDASSIGN(AREAIDA←A, THISAREA) ; A ← ARA ; IDASSIGN(AAA, AA) ;
IF STATA = 1 THEN CLOSEAREA(-DEFA, FALSE) ;
END "CLOSE ALL AREAS" ;
A ← ARF ;
WHILE A DO
BEGIN "AREAOUT"
IDASSIGN(AREAIDA←A, THISAREA) ; NAREA ← 0 ; IDASSIGN(AAA, AA) ;
IF STATA > 1 THEN
BEGIN "AREAUSED" TES CHANGED X TO ARIX 12/5/73 ;
IF GRPOLX AND (STATUS←STATA)=2 AND (ARIX ← DEFA) THEN
BEGIN COMMENT SET UP GROUP OVERFLOW INFO ;
FIXFRAME(NEWPGIDA) ; OPENAREA(ARIX) ; NAREA ← AREAIDA ;
IDASSIGN(AAA, NAA) ; NLFOOT←NPFOOT←NULINE←NUPINE←0 ;
FIXFRAME(OLDPGIDA) ; IDASSIGN(AREAIDA←A, THISAREA) ;
IDASSIGN(AAA, AA) ;
END ;
CS ← COLCA ;
LS ← ARRINFO(AA, 4) ; TES 11/6/74;
F←0; RKJ;
FOR C←1 THRU ULLA-1 DO F←F+XTRALINES[C];
RKJ SEE IF ANY AREAS ABOVE THIS ONE HAVE "XTRALINES";
WORDOUT(INTER, ULLA+F) ; RKJ ADDED F;
WORDOUT(INTER, CS) ; WORDOUT(INTER, LS) ;
FOR C ← 1 THRU CS DO
BEGIN "AREACOL"
WORDOUT(INTER, AA[C,0]) ;
FOOTLINE1 ← LINECA+XGENA - RH(AA[CS+C,0]) ; TES 11/6/74 ;
FOR F ← 0, CS DO FOR L ← 1 THRU LS DO IF (X ← AA[F+C, L]) THEN
IF GRPOLX = 0 OR X < GRPOLX OR X > GRPTOP THEN
BEGIN "AREALINE" LINENO ← IF F=0 THEN L ELSE FOOTLINE1 + L ;
IF (LB ← LDB(LABELM(X))) THEN
BEGIN "A PAGE LABEL"
LBPAGE ← 2 ROT -2 LOR PUTS(PAGEVAL&
(IF XCRIBL THEN ALTMODE&CVS(XLENGTH(PAGEVAL)) ELSE NULL)) ;
WHILE LB NEQ -TWO(13) DO
IF (LINK ← LB) < 0 THEN
BEGIN
LB←NUMBER[-LINK] ;
NUMBER[-LINK] ← LBPAGE ;
END
ELSE BEGIN LB←ITBL[LINK] ; ITBL[LINK]←LBPAGE END ;
END "A PAGE LABEL" ;
IF OWLINE ← OWLS[X] THEN
BEGIN
WORDOUT(INTER, LINENO) ;
WORDOUT(INTER, SHORT[X]) ;
WORDOUT(INTER, MLEAD[X]) ;
WORDOUT(INTER, OWLINE) ;
END ;
END "AREALINE"
ELSE BEGIN "GRP OVERFLOW"
IF F AND NUPINE=0 AND GRPOLX>AA[F+C,1] THEN TES 11/5,12/11/73 ;
BEGIN "FOOTSP"
FOR NUPINE←1 THRU FTGP DO
NAA[F+1,NUPINE] ←
TES 1/16/74 NEWNEW: ;
NEWNEWBLANK(IF NUPINE=1 THEN BLW ELSE ABV!BLW) ;
NAA[F+1,NUPINE]←NOLX←NOLX+1 ;
NOWLS[NOLX] ← OWLSEQ ← OWLSEQ+1 ;
IF XCRIBL THEN
OUT(SINTER,CVSR(OWLSEQ)&ALTMODE&
PICKFONT(FSFONT)&ENOUGH(FOOTSEP,COLWID(AREAIXM),FSFONT)&CRLF)
ELSE
OUT(SINTER, CVSR(OWLSEQ) & ALTMODE &
FOOTSEP[1 TO COLWID(ARIX)] & CRLF) ;
NMOLES[NOLX] ← IF FTGP=0 THEN BLW ELSE ABV!BLW ;
FOR LB←NUPINE+1 THRU NUPINE+FTGP2 DO
NAA[F+1,LB] ← NEWNEWBLANK(ABV!BLW) ;
NUPINE ← NUPINE + FTGP2 ;
END "FOOTSP" ;
NUINE ← IF F THEN NUPINE ← NUPINE + 1 ELSE NULINE ← NULINE + 1 ;
NFOOT ← IF LDB(FOOTM(X)) = 0 THEN 0
ELSE IF F THEN NPFOOT←NPFOOT+1 ELSE NLFOOT←NLFOOT+1 ;
NAA[F+1, NUINE] ← NOLX ← NOLX + 1 ; NOWLS[NOLX] ← OWLS[X] ;
IF NFOOT THEN DPB(NFOOT, FOOTM(X)) ;
NMOLES[NOLX] ← MOLES[X] ;
NSHORT[NOLX] ← SHORT[X] ;
NMLEAD[NOLX] ← MLEAD[X] ;
END "GRP OVERFLOW" ;
WORDOUT(INTER, 0) ;
END "AREACOL" ;
END "AREAUSED" ;
A ← ARA ;
GOAWAY(WHATIS(AA)) ; GOAWAY(AREAIDA) ;
IF NAREA THEN
BEGIN
NAA[1, 0] ← NULINE ; NAA[CS+1, 0] ← NUPINE ;
IDASSIGN(AREAIDA←NAREA, THISAREA) ; COLA ← 1 ; AREAIDA ← 0 ;
END ;
END "AREAOUT" ;
WORDOUT(INTER, -10) ;
END "NONEMPTY" ;
GOAWAY(MOLESIDA) ; GOAWAY(SHORTIDA) ; GOAWAY(MLEADIDA) ;
GOAWAY(-1 LSH 18 + OWLSIDA) ;
MOLESIDA ← MLEADIDA ← SHORTIDA ← OWLSIDA ← GROUPM ← GLINEM ← 0 ;
GOAWAY(FRAMEIDA) ; FRAMEIDA ← OLDPGIDA ← AREAIDA ← 0 ; STATUS ← -1 ;
END "PAGEOUT" ;
IF GRPOLX THEN GRPOLX ← 0 ;
EXNEXTPAGE ← FALSE ;
OVEREST ← 0; comment short font kludge ;
END "FINPAGE" ;
PUBLIC SIMPLE PROCEDURE FIXFRAME(INTEGER FRIDA) ;$"#
BEGIN "FIXFRAME"
IF AREAIDA AND STATUS=1 THEN PLACE(AREAIXM) ; COMMENT BE SURE LINE,PINE STORED IN AA ;
IF MOLESIDA THEN MOLES[0] ← OLX ; TES 1/15/74 ADDED IF.. ;
IDASSIGN(FRAMEIDA ← FRIDA, THISFRAME) ;
IDASSIGN(OWLSIDA ← OWLSF, OWLS) ;
IDASSIGN(MOLESIDA ← MOLESF, MOLES) ;
IDASSIGN(SHORTIDA ← SHORTF, SHORT) ;
IDASSIGN(MLEADIDA ← MLEADF, MLEAD) ;
OLX ← MOLES[0] ; AREAIDA ← 0 ;
END "FIXFRAME" ;
PUBLIC SIMPLE PROCEDURE GROWOWLS(INTEGER EXTRA) ;$"#
BEGIN "GROWOWLS"
GROW(MOLES, MOLESIDA, OLXX, EXTRA, NULL) ; MAKEBE(MOLESIDA, MOLES) ;
GROW(SHORT, SHORTIDA, DUMMY←0, EXTRA, NULL) ; MAKEBE(SHORTIDA, SHORT) ;
GROW(MLEAD, MLEADIDA, DUMMY←0, EXTRA, NULL) ; MAKEBE(MLEADIDA, MLEAD) ;
DUMMY ← 0 ; COMMENT OTHERWISE SPURIOUS MESSAGE FROM GROW 2/28/73 TES ;
GROW(OWLS, OWLSIDA, DUMMY, EXTRA, NULL) ;
MAKEBE(OWLSIDA, OWLS) ;
OWLSF ← OWLSIDA ; MOLESF ← MOLESIDA ; SHORTF ← SHORTIDA ; MLEADF ← MLEADIDA ;
END "GROWOWLS" ;
PUBLIC SIMPLE PROCEDURE MAKEPAGE(INTEGER HIGH, WIDE) ;$"#
BEGIN "MAKEPAGE"
IDASSIGN(FRAMEIDA←CREATE(0,PFREC), THISFRAME) ;
HIGHF ← HIGH; WIDEF ← WIDE;
END "MAKEPAGE" ;
PUBLIC SIMPLE PROCEDURE NEXTPAGE ;$"#
BEGIN
INTEGER SAVEAREA ;
SAVEAREA ← IF AREAIXM THEN LDB(BIXNUM(AREAIXM)) ELSE SYMTEXT ;
NEXTCOUNTER(SYMPAGE, IXPAGE) ;
PLACE(LDB(IXN(SAVEAREA))) ;
END ;
PUBLIC SIMPLE PROCEDURE OPENFRAME ;$"#
BEGIN "OPENFRAME"
MAKEPAGE(FHIGH,FWIDE);
OLXX ← OLMAX ; comment Total of all areas now declared ; OLX ← 0 ;
IDASSIGN(OWLSF←OWLSIDA←CREATE(0,OLXX), OWLS);
IDASSIGN(MOLESF←MOLESIDA←CREATE(0,OLXX), MOLES);
IDASSIGN(SHORTF←SHORTIDA←CREATE(0,OLXX), SHORT);
IDASSIGN(MLEADF←MLEADIDA←CREATE(0,OLXX), MLEAD);
END "OPENFRAME" ;
PUBLIC SIMPLE PROCEDURE OPENPAGE ;$"#
DO BEGIN OPENFRAME ; IDASSIGN(OLDPGIDA ← FRAMEIDA, OLDPAGE) ;
PAGEVAL ← PATT!VAL(PATPAGE) ;
IF FINDTRAN(SYMPAGE, 4) THEN RESPOND(LLTHIS) ;
END UNTIL FRAMEIDA ;
FINISHED
ENDOF("PAGES")